home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
IRIX Development Foundation for IRIX 6.4
/
SGI IRIX 6.4 Development Foundation.iso
/
docs6.4
/
relnotes
/
license_eoe
/
ch7.z
/
ch7
Wrap
Text File
|
1997-09-11
|
115KB
|
3,169 lines
- 1 -
5. _G_l_o_b_e_t_r_o_t_t_e_r__F_L_E_X_l_m__R_e_l_e_a_s_e__N_o_t_e_s
Flexible License Manager
Version 5.11
RELEASE NOTES
February 5, 1997
These release notes describe the changes from FLEXlm v5.0
The release notes for FLEXlm v5.0 appear below.
OVERVIEW
________
o lc_hostid() -- improved hostid interface.
o LM_A_RETRY_CHECKOUT attribute -- improved checkout reliability
o SUPERSEDE="feat1 ... featn" -- New license file option.
Allows one feature to supersede any other previous feature lines.
o PLATFORMS="plat1 ..." -- license can lock to particular
hardware platforms.
o Serial Number hostid (ID=nnnn) -- for licensing without
requiring real end-user hostid.
o lmdiag can checkout individual INCREMENT lines.
o WARNING() -- improved status reporting for Lenient Licensing.
o PERROR(), PWARN() -- easier Windows programming.
o MAX -- New End-User option allows sysadmin to prioritize
use amongst groups.
o TIMEOUTALL -- Easier way to TIMEOUT all features via end-user
options file.
o lc_checkin(...LM_CI_ALL_FEATURES...) -- You can now checkin
all features with one call. This gives a more accurate
log in REPORTLOG than simply exiting.
o LM_A_TCP_TIMEOUT -- Automatically retrieves licenses even
when users turn off their computers (especially Windows).
o CPU Usage is now logged to REPORTLOG file. Vendors can
now charge based on process CPU Usage, and users can
do internal billbacks also based on CPU Usage.
o CPU_USAGE_INTERVAL, CPU_USAGE_DELTA -- Users can fine-tune
how much CPU-Usage information is logged.
- 2 -
o Improved security for expiration dates.
o makekey is improved -- easier to use for more flexible.
o lmswitchr -- improved command-line interface.
o End-User Options file now supports PACKAGE names.
o lmdiag -- REPORTLOG now ignores lmdiag checkouts.
Important Note
______________
The ENCRYPTION_SEED1 and ENCRYPTION_SEED2 in lm_code.h are
numbers which are key to FLEXlm security. They are 0x87654321
and 0x12345678 by default. Each vendor must ensure that you
replace these with numbers which are unique to your company,
and keep these numbers secret. Only someone with access to
these numbers can generate license files that will work with
your application. MAKE SURE the numbers are not left to the
defaults.
Notice of Future Changes
________________________
Discontinuing "man" Pages
_________________________
Starting with v6 of FLEXlm, we will no longer ship a "man"
directory, with Unix-style man pages. These seem to
be more rarely used these days, and we ship HTML files
which provide a more popular on-line interface.
Discontinuing debug_libs directory
__________________________________
Starting with v6 of FLEXlm, we will no longer ship a
debug_libs directory.
New Features in V5.1
____________________
lc_hostid() -- improved hostid interface.
_________________________________________
int lc_hostid( LM_HANDLE *job,
int id_type,
char buf[MAX_CONFIG_LINE])
lc_hostid() fills in buf with a hostid string
- 3 -
specified by type. If type is HOSTID_DEFAULT, you get
the default hostid type on the system.
Hostids have become more flexible in recent versions,
and this allows programmers access to hostid
information in string format. It's recommended in the
future that programmers use this function and avoid
functions that deal with (HOSTID *) struct
information, since this may change from version to
version.
Note that lc_hostid may return a space-separated list
of hostids, if that's appropriate on a given system.
Hostid types are specified and described in lmclient.h
and include
HOSTID_LONG HOSTID_ETHER
HOSTID_ANY HOSTID_USER
HOSTID_DISPLAY HOSTID_HOSTNAME
HOSTID_ID_MODULE HOSTID_STRING
HOSTID_FLEXID1_KEY HOSTID_DISK_SERIAL_NUM
HOSTID_INTERNET HOSTID_DEMO
HOSTID_FLEXID2_KEY HOSTID_FLEXID3_KEY
HOSTID_FLEXID4_KEY HOSTID_FLEXID5_KEY
HOSTID_SERNUM_ID HOSTID_VENDOR
HOSTID_DEFAULT
lc_hostid returns 0 on success, and the FLEXlm errno on
error.
LM_A_RETRY_CHECKOUT attribute
_____________________________
When true, checkouts that fail due to communications
errors are automatically retried once. Often this
second attempt will succeed on networks with poor
communications. This is turned on by default in both
the Simple and Trivial API, and the default is off in
the FLEXible API. Use
lc_set_attr(job, LM_A_RETRY_CHECKOUT, (LM_A_VAL_TYPE)1);
to turn this attribute on for the FLEXible API
(recommended). It's turned off by default in the
FLEXible API so that previous default behavior is
preserved.
License File Enhancments
________________________
- 4 -
SUPERSEDE List
______________
SUPERSEDE
SUPERSEDE="feat1 ... featn"
SUPERSEDE=*ALL*
SUPERSEDE (new in v5.0) can now take a list of features
to supersede. This means that you can ship a single
feature line which, if installed, will make other
features with previous ISSUED dates unavailable to
your customers. This is a way to securely phase out
FEATUREs already shipped. If the list is "ALL", then all
previously issued FEATURE lines are disabled.
PLATFORMS="..."
_________________________
This allows you to restrict usage to particular hardware
platforms. The platforms are defined as the same platforms
that are used to license FLEXlm itself: sun4_u4, i86_n3, etc.
The names can be found in the Platform Specific Notes section
at the bottom of this file. Note that the platform
name can be overridden with
lc_set_attr(job, LM_A_PLATFORM_OVERRIDE, (LM_A_VAL_TYPE)str);
Note that the trailing digit in the platform name is
ignored, and can be optionally left off in the name.
If the platform list differs in any way for 2 INCREMENT
lines for the same feature-name, they're are pooled
separately and counted separately.
Examples:
FEATURE f1 ... PLATFORMS=sun4_u4
INCREMENT f2 ... 1 PLATFORMS="i86_w alpha_u"
INCREMENT f2 ... 1 PLATFORMS="i86_w"
f1 can be used on any sparc station running SunOS or
Solaris.
f2 can be used on a PC running Windows (not NT) and
Dec Alpha running OSF1 or DEC-Unix. There's 1 license
that can be shared between all Windows and Alpha-Unix
systems, and 1 more license just for Windows. That is,
at most 1 f2 can be used on the Alpha-Unix systems,
but at most 2 f2s can be used by Windows systems.
- 5 -
If the checkout fails because it's on the wrong
platform, the error returned is LM_PLATNOTLIC:
"This platform not authorized by license"
ID=1234 HOSTID
______________
We now support a pseudo-hostid of "ID=...". This is
functionally equivalent to the "ANY" hostid -- it
will run on any node. The difference is that the
customer has a unique identifier that can be used
to identify the customer. This hostid can be used
to lock the license server (on the SERVER line) or
the client node (on the FEATURE/INCREMENT line) --
anywhere a hostid can be used. The number can have
dashes included for readability -- the dashes are
ignored.
Examples:
ID=12345678 is the same as
ID=1234-5678 is the same as
ID=1-2-3-4-5-6-7-8
The HOSTID struct for this type is setup thus:
type = HOSTID_SERNUM_ID
id.string contains the id in string format.
lmdiag can now checkout individual INCREMENT or FEATURE lines
_____________________________________________________________
If a license file contains multiple lines for a
particular feature, you can now select a particular
line for lmdiag to report on. For example:
lmdiag f1:HOSTID=12345678
will attempt a checkout on the line with the hostid limited
to 12345678
The full syntax is:
lmdiag feature:specification=value
where:
feature feature name
specification one of the following:
VERSION
HOSTID
- 6 -
EXPDATE
KEY
VENDOR_STRING
ISSUER
NOTICE
dist_info
user_info
asset_info
value the value specifies a particular line.
WARNING(): Warning messages for Simple and Trivial API
____________________________________________________
With LM_LENIENT and LM_FAILSAFE, a CHECKOUT or lp_checkout() call
may succeed, while the license was not actually checked out.
In this case, an application may want to inform the user of
the condition, while still running.
If there is a warning condition:
1) CHECKOUT() and lp_checkout() will return 0 (success),
2) lp_warning() and WARNING() will return a string
describing the warning condition.
If there is no warning condition (the license was fully
checked out from the server), then lp_warning() and WARNING()
will return 0 (NULL).
PERROR(), PWARN(), lp_perror() and lp_pwarn()
___________________________________________________________
These Trivial and Simple API functions all print error
and/or warning messages to the user.
Windows: The messages appear in popups.
Unix: The messages are printed to stderr.
These functions are most useful on windows systems, since the
popups are convenient for programmers and end-users.
End User Options File Enhancments
___________________________________
MAX
___
Syntax: MAX numlic featurename type name
Example: MAX 4 f1 GROUP accounting
MAX gives your customers significantly more flexibility in
how they prioritize use of licenses at their site. In past,
- 7 -
you could RESERVE licenses for individuals, or prevent
individuals from using licenses, but with MAX, you can now
indicate that a particular GROUP has a maximum use. You can
also specify USER, HOST, HOST_GROUP, etc. as with all end-user
options. If a checkout exceeds the maximum, they will see the
following error message:
Checkout exceeds MAX specified in options file (-87,147)
TIMEOUTALL
__________
This works the same as TIMEOUT, but applies to all features:
TIMEOUTALL 1000
All features are timed out in 1000 seconds. See the
Programmers and/or End-User manual for more information
on TIMEOUT behavior.
End-user Options features can now be PACKAGE names
__________________________________________________
If you specify a PACKAGE name in the options file, it
will apply to all features in that package. This is
true for both regular PACKAGEs and OPTIONS=SUITE.
lc_checkin() now takes LM_CI_ALL_FEATURES
_________________________________________
The feature for lc_checkin can now be LM_CI_ALL_FEATURES
(which is actually a NULL pointer). This will check in all
features currently checked out. This has nearly the same
effect as calling lc_disconn() or even lc_free_job().
However, since a checkin message is actually sent to the
server, the REPORTLOG logs this as a normal checkin().
checkins that occur because of a disconnect are indicated
differently in the log, so that end-users could differentiate
between an application that actually calls checkin, and one
that simply exits.
IMPORTANT: If you use LM_CI_ALL_FEATURES (in the client) with
ls_infilter (in the vendor daemon), then ls_infilter MUST
check the feature name against LM_CI_ALL_FEATURES, which is
actually a NULL pointer. Failure to do so may result in a
crash. That is, you must check:
if (feature != LM_CI_ALL_FEATURES)
- 8 -
LM_A_TCP_TIMEOUT
________________
If a client node crashes or the client node is disconnected
from the network, the license will be automatically checked
back in in LM_A_TCP_TIMEOUT seconds.
default: 2 hours (60*60*2).
Maximum value: 4 hours 15 minutes (15300 seconds),
or 0 means NO TCP timeout.
Minimum value: 60 seconds
CPU Usage is now logged to REPORTLOG file.
__________________________________________
CPU Usage is now automatically always logged when the
REPORTLOG file is in use. In addition, this can be
fine-tuned by the end-user with 2 settings in the
end-user options file. The settings allow the user to
limit how much CPU-usage is logged, thereby reducing
log file size. By default, CPU-usage is only logged
at checkout and checkin. However, it can also be
logged with heartbeats enabling more accurate and
fine-tuned CPU-usage reporting.
REPORTLOG filename [ CPU_USAGE_INTERVAL = {n|CONTINUOUS} ] [CPU_USAGE_DELTA = n]
CPU_USAGE_INTERVAL=n -- CPU-usages from heartbeats
will be reported no more often than once every n
minutes. Default is a huge number.
"CONTINUOUS" is the same as 0, but is easier
to read.
CPU_USAGE_DELTA=n -- n is in tenths of a second of CPU
time. Only log CPU-usage if it has changed
from the last log by n/10 seconds of CPU-time.
Improved Expiration Date Checking
_________________________________
FLEXlm now automatically makes the following checks to ensure
security of the expiration date. These checks ONLY occur if the
license to be granted is expiring.
1) If the date on the system running the license
server has been set back more than 24 hours,
checkout fails with LM_BADSYSDATE
2) If the client is NOT using USE_SERVER or port@host,
the checkout fails if the client node's system date
has been set back more than 24 hours.
- 9 -
3) If the client's date differs by more than 24-hours
from the server's date.
FLEXible API Changes
____________________
lc_baddate and lc_set_attr(...LM_A_MAX_TIMEDIFF) are now disabled
_________________________________________________________________
These checks are modified and automatically performed, so these
calls are no longer needed. For compatibility, the functions
can be called, but they don't do anything.
We found some cases on Unix with the date expiration
routines (identified as bug P2181), which caused
a checkout to hang or take a long time. In order to fix
these cases, the routines which detect a systems
date being set back do not detect a set-back date as often
as they did previously.
lc_expire_days returns LM_FOREVER on unexpiring license
_______________________________________________________
If the license doesn't expire, the expiration date is set to
1-jan-0, and lc_expire_days will return LM_FOREVER, which
is defined to be 9999. In version 5.0, lc_expire_days returned
the number of days until a date in the year 2038.
Other Enhancements
__________________
makekey prompts are more helpful
________________________________
The makekey license generator now has a simplified, more
helpful interface, and supports the all FEATURE attributes.
lmswitchr accepts daemon name
_____________________________
lmswitchr syntax is now:
lmswitchr [ -c license_file ] daemon new-file, or
lmswitchr [ -c license_file ] feature new-file
- 10 -
It used to only accept a feature name. It now accepts a
daemon name also, and this is usually easier to use.
lmgrd -nfs_log -- faster logging
________________________________
The -nfs_log is used to turn off fflush() commands to
both the debug log and REPORTLOG files. Through
internal testing we've discovered that fflush() can,
on some systems, noticeably slow down the servers when
they log to files that are NFS-mounted.
In practice we recommend that log files NOT be
NFS-mounted, but if you must do this, -nfs_log is then
recommended. This may mean that the log files will be
behind by a transaction or two, but in practice we
find that -nfs_log actually makes no noticeable
change, except to make the servers run faster.
lmdiag: server logs do not record checkout
___________________________________________
In previous versions, when lmdiag checked out a
license from the server, the server logs recorded the
checkout. The logs now no longer are affected by
lmdiag.
lmcrypt: -f is now the default
______________________________
In previous versions lmcrypt required -f to encrypt
a line already encrypted. This is now the default
behavior and doesn't require the -f argument.
If you prefer the old behavior, it can be modified
in machind/lmcrypt.c. The -f argument now has no effect.
Other Changes
_____________
makekey.c now uses lc_cryptstr()
________________________________
makekey source now uses lc_cryptstr() as encrypting
function. It previously used lc_crypt(), which is a
harder function to use and maintain across FLEXlm
versions. We now recommend that lc_cryptstr() be used
- 11 -
in its place.
Bug fixes:
__________
Bug Platform Description
P1039 all lmcrypt and lc_cryptstr() ignore FEATURESET.
P1414 all lmcrypt doesn't always truncate license file
lines to 80 characters. Note that this
fix only applies to lines that are in the
v4+ format -- to force this, add ck=0 attributes
to each line.
P1460 all In rare cases, checkouts with LM_A_CHECKOUT_DATA
and LM_DUP_VENDOR can become orphaned and never
checked in.
P1499 Win32 lsvendor.c defaults ls_minimum_user_timeout to 30
seconds.
P1488 all lc_expire_days() returns number of days until
max-unix date if no expiration. Fix is to
return LM_FOREVER.
P1506 all hostid lists should force FEATURE lines to be
printed in "new" new format, i.e., HOSTID="..."
P1511 all If TIMEOUT set, if the client tries to
do a checkout between when the server frees the
license and the client does a heartbeat, communications
fail. rare.
P1593 all lmdiag core dumps if no SERVER line in license file.
P1602 all lc_heartbeat() doc is missing from Reference Manual.
P1603 all copyright was a global symbol. All FLEXlm global
symbols should have "l_" or "lc_" prefix.
P1619 all lmstat reports non-suite PACKAGE name as "Error"
P1621 all 1 process checks out 2 SUITE components, then checks
1 in: SUITE-token should remain checked out, but
is not.
P1658 all The following end-user options file syntax did
not RESERVE the right FEATURE line:
"RESERVE ... feature:HOSTID=nnn"
P1659 all lmdiag: If there's several INCREMENT or FEATURE lines
for the same feature name, lmdiag only reported on
the last line.
P1674 all lc_test_conf after checkout with LM_CO_LOCALTEST
returned null if using port@host or USE_SERVER.
P1676 all CHECKIN the same feature twice resulted in a core dump.
P1708 Win32 Server log says "Unknown Signal" from lmdown.
P1715 all vendor-defined hostids fail if the vdef hostid
routine returns lowercase characters.
P1728 all On some platforms, LM_PROJECT environment variable
can cause vendor daemon to crash.
P1741 all 1) use port@host or USE_SERVER, 2) feature removed
- 12 -
from license, then lmreread, 3) checkout returns
LM_MAXUSERS instead of LM_NOFEATURE.
P1778 all lmcrypt core dumps when hostid has 0x prefix.
P1825 all lmdiag with colon-separated LM_LICENSE_FILE -- stops
reporting when on file in the list doesn't exist.
P1843 all lmdiag reports that licenses have incorrect syntax
when they have vendor-defined hostids, though the
files are correct.
P1850 all lc_cryptstr() and lmcrypt have memory leaks when
the feature contains "ck=nnn"
P1883 all purify reported harmless bug in l_key.c.
P1901 all lmcrypt/lc_cryptstr() fails with decimal hostids
(#nnn) larger than the maximum positive 32-bit int.
P1929 all Some lmutil utilities fail (lmdiag/lmutil, etc.) with
FLEXLM_COMM_TRANSPORT set to UDP.
P2045 all lmcrypt could core dump with mistyped license file.
P2058 alpha_u3 checkout uses a file descriptor which is not closed.
P2059 all memory leak when LM_A_LICENSE_DEFAULT is called > 1
time in a job.
P2096 i86_d4 (DG Intel): checkouts were slow.
P2118 all makekey generates incorrect ck= checksum when
line wraps with ''.
P2181 all On unix systems, lc_baddate could cause a checkout
to take a long time, or sometimes hang.
Known bugs:
___________
P1852 2 HP provides a command for changing the ethernet
address/hostid.
Patch: None.
Workaround: Use uname -i hostid, which is more
secure.
Platform Specific Notes:
________________________
i86_w3
______
Win32s will not be supported after FLEXlm v5. This is
because Microsoft is discontinuing support for win32s.
UNIX
____
alpha_u3
________
- 13 -
uname -a: OSF1 zippy V3.2 17 alpha
CC: cc -std1
NOTE: alpha_u1 is discontinued. This only means that
we no longer support v1 and v2 of the OS, and
virtually no one uses those OS versions. Alpha_u3
fully supports Alpha DEC Unix 3 and 4.
decs_u4
_______
uname -a: ULTRIX newport 4.2 0 RISC
CC: /bin/cc -DPMAX -DULTRIX -DMIPS
dg_u5
_____
uname -a: dgux dgsvr4 5.4 generic AViiON mc88100
CC: /bin/cc
encore_u4
_________
uname -a: UNIX_SV encore 4.2MP 4.0.0.10 m88k m88k
CC: /usr/bin/cc
hp300_u8
________
uname -a: HP-UX agent86 B.08.00 A 9000/375 080009060992
CC: /bin/cc
link flags: -lBSD
hp700_u8
________
uname -a: HI-UX hit1 02.03_/B E 3050/R 154
CC: /bin/cc -Aa -D_HIUX_SOURCE +DA1.0 +DS1.0
(replace HIUX with HPUX on an HP system)
Hostid note: See Bug P1852 above -- we no longer recommend
using ethernet address as a hostid.
i86_d4
______
uname -a: dgux dgbig R4.11 generic AViiON Pentium
CC: /bin/cc, actually, /usr/opt/sdk/sde/ix86dgux/usr/bin
NOTE: hostid comes from /dev/net/*. By default these files
are only readable by root. We recommend changing the
perms to:
- 14 -
# chmod 644 /dev/net/*
i86_l1
______
uname -a: Linux linux 1.2.13 #1 Sun Aug 13 06:33:35 EDT 1995 i586
CC: /usr/bin/cc
cc -v: Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.0/specs
gcc version 2.7.0
IMPORTANT NOTE: v5 version uses ethernet address as a hostid,
which is relatively secure. v4 used the 'hostid' command,
which was not secure. To obtain the ethernet address, type:
/sbin/ifconfig eth0
Convert the hardward address as follows:
From: HWaddr 00:40:05:16:E5:25
To: 00400516E525
V5 lmhostid will report ethernet address by default. v4
will report 'hostid'. Both types of hostid are acceptable
to version 5 clients and servers.
lmhostid, or lmhostid -ether
-- obtains the ethernet address (secure)
lmhostid -long
-- obtains the output from the 'hostid' command
(not secure)
i86_u2
______
uname -a: UNIX_SV rolm 4.2MP 2.0 i386 x86at
CC: /usr/bin/cc
i86_x5 (Solaris on Intel)
______
uname -a: SunOS sunpc 5.4 generic i86pc i386
CC: /opt/SUNWspro/bin (version 3.0)
moto_u4
_______
uname -a: UNIX_System_V motosvr4 4.0 R40V4.2 m88k mc88100
CC: /bin/cc
link flags: -lsocket -lnsl
nec_u2
______
- 15 -
uname -a: UNIX_System_V nec 4.0 2 R3000 r3000
CC: /bin/cc
link flags: -lsocket -lnsl
/usr/necbin/uversion: Release6.2 Rev01 - EWS4800/220 - WS
rs6000_u3
_________
uname -a: AIX rs6000 1 3 000276513100
CC: /bin/cc -D_BSD -D_BSD_INCLUDES
link flags: -lbsd
sco_u3
______
uname -a: SCO_SV sco 3.2 2 i386
uname -X:
System = SCO_SV
Node = sco
Release = 3.2v5.0.0
KernelID = 95/04/19
Machine = i80486
BusType = ISA
Serial = 2CG001148
Users = 5-user
OEM# = 0
Origin# = 1
NumCPU = 1
CC: /bin/cc -Dsco
link flags: scoinfo.o -lsocket
IMPORTANT NOTE: Previous FLEXlm versions were built on an older OS:
Release = 3.2v2.0
KernelID = 90/10/01
sgi_u4
______
uname -a: IRIX oly 4.0 08212247 IP6
CC: /usr/bin/cc -cckr
link flags: -lsun -lbsd -lc_s
sgi_u5
______
uname -a: IRIX indy 5.2 02282013 IP12 mips
CC: /bin/cc
To build -n32 -mips3 or -n32 -mips4 on IRIX 6:
- 16 -
1) In this directory, do:
% make o32
This builds all binaries in o32 format.
2) Link your application (which has been compiled with
-n32 -mips3 (or -mips4) with the correct FLEXlm library:
liblmgr_n32mips3.a, or
liblmgr_n32mips4.a
NOTE: sgi keys are required for any 32-bit binary, including
IRIX 6 with -n32 flags.
sgi64_u6
________
uname -a: IRIX64 challenger 6.1 07121831 IP26 mips
CC: /bin/cc
This was called sgir8_u6 in previous versions. It's been
renamed to reflect the fact that it's 64-bit.
To build -n32 -mips3 or -n32 -mips4, see sgi_u5 above.
We currently only support 64-bit, mips4 binaries, which
is how all files in this directory are compiled.
sun4_u4
_______
uname -a: SunOS ss 4.1.2 2 sun4c
CC: /bin/cc
sun4_u4 is now built on a 4.1.2 system. This means that it
will no longer work with 4.0.3 systems.
sun4_u5
_______
uname -a: SunOS backstage 5.1 Generic sun4m sparc
CC: /opt/SUNWspro/bin/cc
Java Addendum
- 17 -
Installation and Directory Naming
---------------------------------
No special installation of the FLEXlm class files is required.
The classes are in the java_01/flexlm directory of the FLEXlm
v5.1 main directory. Note that the FLEXlm class files must reside
in a directory called "flexlm", since they are in a Java package
named "flexlm".
If you are running Java applications, you must set your CLASSPATH
environment variable to include a component reflecting the location
of the FLEXlm classes. For example, if you installed the FLEXlm
classes into "/a/b/c/lmgr/v5.1/java_01/flexlm" you would include
the following component in your CLASSPATH:
"/a/b/c/lmgr/v5.1/java_01"
If you are setting up the FLEXlm class files for access by an http
server, they must reside in a directory called "flexlm", again
because the FLEXlm class files are in the "flexlm" package.
New Features Since v5.0
-----------------------
With LM.LENIENT and LM.FAILSAFE, checkout() may succeed, while
the license was not actually checked out. In this case, an
application may want to inform the user of the condition, while
still running. If there is a warning condition:
1) checkout() will return 0 (success),
2) warning() will return a string describing the warning
condition.
If there is no warning condition (the license was fully
checked out from the server), warning() will return null.
The string to use for the Java platform in the PLATFORM= keyword
is "java_0".
The default TCP_TIMEOUT in FLEXlm/Java is 255 minutes. There is
no API for changing this value.
Integrating FLEXlm/Java into Your Java code
-------------------------------------------
The constructor method for the "license" class takes your
vendor keys and your encryption seeds as arguments. Since
the encryption seeds must be kept secret (anyone who knows
your encryption seeds and has a FLEXlm kit can generate
licenses for your product), they are XORed with vendor key 5
when passed as method arguments. It is strongly recommended
that you not store your encryption seeds and vendor keys in
variables, or pass them verbatim as arguments.
For example, given the following:
Vendor name = xyzcorp
vendor key 1 = 0xabcd1
- 18 -
vendor key 2 = 0xabcd2
vendor key 3 = 0xabcd3
vendor key 4 = 0xabcd4
vendor key 5 = 0xabcd5
encryption seed 1 = 0xdead1
encryption seed 2 = 0xdead2
you would invoke the license constructor as follows:
license lic = new license ("xyzcorp", 0xabcd5 ^ 0xdead1,
0xabcd5 ^ 0xdead2,
0xabcd1, 0xabcd2, 0xabcd3, 0xabcd4);
In this way, it's much harder for someone reading disassembled
code to discover your encryption seeds.
Node-locked Licenses
--------------------
Since Java is so portable and generic, there is not nearly the
range of possibilities for determining a unique hostid in the
Java environment as there are in the C/C++ world. Therefore,
the FLEXlm/Java library supports only "DEMO", "ANY", and
INTERNET=xxx.xxx.xxx.xxx hostids. Hostid lists are supported,
so you can node-lock a license to a list of hostids, for example:
"INTERNET=1.2.3.4 INTERNET=1.2.3.5 INTERNET=1.2.3.6". Wildcards
are supported in address octets.
Locating the License File
-------------------------
The checkout method allows you to specify the license file location.
This is used to supply a runtime-determined license file location,
such as a value supplied on the command line, applet parameter, or
a default. It may be specified as a colon-separated list of license
files and/or port@host specifications.
License File Restrictions
-------------------------
When possible, it is preferable to use "port@host" to locate the
license file, rather than a license file path. This is because
the FLEXlm/Java implementation is not capable of parsing all
possible license file syntax - when port@host is used, the server
does all the license file parsing. Specifically, the FLEXlm/Java
implementation understands only the following license file lines:
SERVER
DAEMON (ignored)
USE_SERVER
FEATURE
INCREMENT
Comment lines (lines starting with the "#")
- 19 -
Inclusion of other line types may cause an error.
In addition, the Java library does not understand KEYWORD=value
pairs (with the exception of "INTERNET=xxx.xxx.xxx.xxx" for host
ID). or lines continued with "
Examples of license file lines which are understood by the Java
client:
SERVER speedy ANY 7132
DAEMON demo /u/flexlm/sun4_u4/demo
FEATURE f1 demo 1.000 1-jan-00 4 BBF8808162D4072297FF ""
FEATURE f2 demo 1.000 1-jan-98 0 FBA85061E4ACCBA6D932 "" "INTERNET=192.156.198.82 INTERNET=192.156.199.*"
Examples of license file lines which are not understood by the
Java client:
PACKAGE p1 demo 1.000 8040204170869E176457 COMPONENTS="c1 c2"
FEATURE f1 demo 1.000 1-jan-0 4 BBF8808162D4072297FF "" HOSTID=2f2f2f2f
FEATURE f2 demo 1.000 1-jan-98 0 FBA85061E4ACCBA6D932 "" "INTERNET=192.156.198.82 INTERNET=192.156.199.*"
To reiterate, the restriction is that the FLEXlm/Java library cannot
parse these lines - it is perfectly reasonable to use such lines in
a license file accessed via port@host, as the server does all the
parsing in that scenario. License file paths should be used only
for uncounted licenses, where it's not necessary to run a server.
FLEXlm display
--------------
The FLEXlm display is a constant ("JavaDisplay") in the Java version.
Development Environment
-----------------------
The FLEXlm/Java classes were compiled using Sun's JDK v1.0.2
on Solaris/SPARC 2.x.
Known bugs in this version
--------------------------
- Checkin is broken in port@host environment if license file line is
greater than 145 bytes long. checkin fails when called, but any
licenses checked out by an application or applet are checked in
when it exits.
- If USE_SERVER is present anywhere in the license file, it causes
the server to be used for everything, not just the lines following
USE_SERVER.
- 20 -
Flexible License Manager
Version 5.0a
RELEASE NOTES
24 May, 1996
These release notes describe the changes from FLEXlm v4.0
To upgrade v4 source to v5, make the following changes:
1) Change "#include lm_client.h" to "#include lmclient.h"
2) Change LM_CODE macro:
ENCRYPTION_CODE_1 to ENCRYPTION_SEED1
ENCRYPTION_CODE_2 to ENCRYPTION_SEED2
Other, rarely needed function names were also changed. See
the "FLEXible API Changes" section for a more complete listing
of source changes you may need.
OVERVIEW
________
o port@host Plus! -- clients no longer need access to license file.
More efficient and robust. Log files now can also log uncounted
licenses.
o USE_SERVER line -- client applications automatically get the
benefits of port@host Plus without having to set an environment
variable.
o New Trivial and Simple APIs. Get FLEXlm functionality with
3 function calls.
o lc_expire_days() -- function to tell when a license will expire
o Server automatically notifies of licenses that will expire soon
upon startup.
o Hostid lists -- ability to lock a single FEATURE or INCREMENT line
to several hostids. For example, allow 10 uses to be shared amongst
only 3 nodes, by hostid.
o Improved easier API for vendor-defined heartbeats.
o lc_timer() ("heartbeats") interface made easier.
o Easier specification of default license file location.
o $LM_PROJECT environment variable added to REPORTLOG data for
FLEXadmin reporting.
o Improved Internet Firewall support -- Can specify TCP port number
on DAEMON line.
o Feature names in end-user Options file can now optionally
specify particular INCREMENT lines.
- 21 -
o Improved lmcrypter error reporting, via new function lc_chk_conf()
o IP Address supported for hostname on SERVER line.
o CAPACITY license allows vendors to charge based on the
power of the system: e.g., PC clients can be charged less than
Unix clients.
o Consolidate license files with SUPERSEDE option on FEATURE line
o New ISSUED=date attribute -- readable issued date
o USER_BASED and HOST_BASED licenses -- requires specified number of
users (or hosts) to be INCLUDEd via the end-user options file.
o FEATURE serial number attribute: "SN=value".
o FEATURE MINIMUM=n checkout attribute.
o DUP_GROUP for SUITE parent -- added flexibility for PACKAGE licensing.
o MAX_OVERDRAFT in end-user options file -- allows end-user to limit
OVERDRAFT -- for negotiated fees with trusted customers.
o End-user options vendor-daemon "pool" selection -- so end-users
can specify which INCREMENT line a RESERVE applies to.
o lc_vsend() automatically connects to the server.
o Improved end-user-specified TIMEOUT behavior -- the license is
freed at the TIMEOUT time, rather than upon subsequent
checkout request.
o lmdiag provides more detailed FEATURE descriptions.
o REPORTLOG format improved -- it's takes 75% less disk space,
holds significantly more information, and will produce faster
FLEXadmin reports.
o lmstrip utility for security.
o Overall improved security.
New Features in V5.0
____________________
port@host PLUS!
_______________
This is a significant enhancement for the port@host
feature in FLEXlm -- the behavior is nearly the same
as the existing port@host feature, but performance
is enhanced. (Note: the old behavior is still available
with the syntax "-port@host" -- prepend a minus sign).
With port@host PLUS:
o The client never reads the license file,
so startup is faster, particularly with
large license files.
o Sites with large license files, or Wide-Area
networks can now safely use port@host
o License servers can now log usage of
uncounted licenses. To do this, make sure
the license file has a SERVER and DAEMON
line. If it does not, simply prepend them.
The debug and report log files will then
log usage for uncounted licenses in addition
- 22 -
to the normal logging of counted licenses.
Automatic port@host via USE_SERVER
__________________________________
port@host behavior is preferable to having the client
application read the license file, since the application
does not have to have a file in sync with the server.
Now you can get this behavior automatically. Simply
put the USE_SERVER keyword in the license file
after the SERVER line, and the client will behave as
though it were using port@host.
If you have uncounted lines in your license file,
and you're not running a server, or if you want clients
to not check out uncounted licenses from your
running server, put the uncounted lines before the
USE_SERVER line in the file.
With USE_SERVER, client copies of the license file
are only required to have a SERVER line, followed by a
USE_SERVER line. Anything after that in the file
is ignored by client applications.
New Optional Trival and Simple APIs:
___________________________________
This new API is "policy-based". That is, you specify
an overall policy, with some optional modifiers, and
everything is taken care of automatically. This
new API is recommended for most companies that have
straightforward licensing needs.
Every attempt is made in these APIs to automatically
solve common problems. For example, the display
setting comes from the $DISPLAY environment variable,
which is converted to an IP address for security
reasons. For this reason, to override the display
setting, a programmer should use putenv() (or
setenv()) to set the variable before checking out a
license. You will notice other, automatic, behavior
that differs from the old, now called "FLEXible", API.
See the example in machind/policy.c.
The following is a complete, correct example of
the new API, using the Trivial API macros:
- 23 -
#include "lmpolicy.h"
main()
{
if (CHECKOUT(LM_RESTRICTIVE, "f1", "1.0","license.dat"))
{
fprintf(stderr, "%s0, ERRSTRING());
exit(1);
}
/* your application code here */
CHECKIN();
}
POLICIES:
_________
LM_RESTRICTIVE -- checkout, return failure if fails
LM_QUEUE -- checkout, but queue if failure
return error if other
LM_FAILSAFE -- Always run. Queue for license
if MAXUSERS.
LM_LENIENT -- return error on MAXUSERS, otherwise
return success.
MODIFIERS:
__________
LM_MANUAL_HEARTBEAT -- call HEARTBEAT(), which returns number
of retries
LM_RETRY_RESTRICTIVE -- HEARTBEAT will attempt retries forever,
unless this is set, where it will
exit after the 5th retry attempt.
FUNCTIONS:
__________
There's 2 levels of function calls: macro-level
(Trivial) and actual functions (Simple). Most users
will be able to use the Trivial API, which works only
work if your binary checks out no more than one
feature at a time. Otherwise, you'll need to use the
function calls.
Trivial API:
CHECKOUT(policy, feature, version, licpath)
where
policy (int) is one of the policies listed above, with
modifiers ORed in, e.g.,
LM_RESTRICTIVE | LM_MANUAL_HEARTBEAT.
- 24 -
feature (char *) feature name.
version (char *) version in floating point format.
licpath (char *) path to default location for license
file. If 0, ignored.
Returns 0 if success, else FLEXlm lm_errno.
CHECKIN() -- checks in the license from CHECKOUT
ERRSTRING() -- returns (char *) explanatory message
for the latest FLEXlm error.
HEARTBEAT() -- exchanges heartbeat messages with
server. Returns 0 if success, else,
number of failed retry attempts performed.
Simple API:
lp_checkout(VENDOR_NAME, code, policy, feature,
version, nlic, licpath, lp_handle)
where
VENDOR_NAME -- from lm_code.h.
code -- from LM_CODE macro, as in normal FLEXlm
policy -- see CHECKOUT above.
feature -- ditto
version -- ditto
nlic -- number of licenses to checkout
licpath -- see CHECKOUT above
lp_handle -- pointer to LP_HANDLE *. This is
return handle from lp_checkout, and
is used with all subsequent lp_xxx
calls, e.g.,
LP_HANDLE *lp;
...
lp_checkout(...,&lp);
return values same as CHECKOUT
lp_checkin(lp) -- lp is value returned from lp_checkout
lp_errstring(lp) -- lp is value returned from
lp_checkout
lp_heartbeat(lp, nreconn, minutes)
(Only used if policy is modified with
LM_MANUAL_HEARTBEAT)
lp -- value returned from lp_checkout
nreconn -- pointer to integer -- number of
- 25 -
reconnects in "minutes" (if NULL,
ignored)
minutes -- return nreconn in this many
minutes (if 0, ignored)
lp_heartbeat return values same as HEARTBEAT
nreconn can be used to discourage
end-user theft by stopping and
starting servers.
New FEATURE attributes:
_______________________
Hostid Lists
____________
Hostids can now be a list of hostids. The syntax is:
"hostid1 hostid2 ... hostidn"
For FEATURE lines in the new format, this will look
like:
FEATURE ... HOSTID="hostid1 hostid2 ... hostidn"
This can be used on the FEATURE/INCREMENT/UPGRADE
lines, but is not supported on the SERVER line (where
it's not really needed). It allows node-locking to a
list of hosts, an often requested feature.
HOSTID struct now has a new member: next. This is now
a null-terminated list of hostids. Usually, vendors
that examine this struct only do so to see if they
have a DEMO license. For that reason, this new member
(next) should normally not be needed by vendors.
Two new functions are available for these lists (which
should be rarely needed):
void lc_free_hostid(job, hostid)
and
HOSTID *lc_copy_hostid(job, hostid)
DAEMON port number -- Internet Firewall Support
_______________________________________________
Some firewalls require the administrator to specify
- 26 -
which ports are available to clients outside the
firewall. In this case it is necessary to define not
only the TCP port that lmgrd will use, but also the
port each vendor daemon will use. This can now be
done on the DAEMON line. The new syntax is:
DAEMON vdaemon_name path [ [port=]port_num ] [ [options=]options.dat ]
where port_num is a TCP port number and options.dat
is the path to the end-user options file.
For VMS, the old syntax for port, as well as this new
syntax, is supported. This is not, however, currently
supported for NT or Netware servers, and it's unlikely
to be needed since firewalls are currently rarer for
these systems.
SN=serial_number
________________
SN=serial_number: This is a optional, encrypted, string
attribute, useful for differentiating otherwise
identical INCREMENT lines.
USER_BASED and HOST_BASED
_________________________
Syntax:
USER_BASED[=n]
HOST_BASED[=n]
If USER_BASED is specified, then all licenses must be
INCLUDEd to USER names via the end-user options file.
Similarly, if HOST_BASED is specified, then all
licenses must be INCLUDEd via HOST names.
USER_BASED cannot appear on the same line with HOST_BASED.
If =n appears, then the number of USERs or HOSTs is
limited to n; otherwise, the limit is the number of
users in the FEATURE.
Will create new vendor-daemon pools. (See note about
Vendor Daemon Pools later in this RELEASE_NOTES.)
MINIMUM=n
_________
Syntax: MINIMUM=min. If lc_checkout(...nlic...),
- 27 -
nlic is less than min, then the server will checkout min.
SUPERSEDE and ISSUED
____________________
This allows vendors to sum up a set of INCREMENT lines
in a single, new FEATURE (or INCREMENT) line, which
supersedes all INCREMENT lines for the same feature
name with previous start-dates. Note that the start
date is the one field which is not readable in the
license file, and is part of the 20-character license
key.
To make this more readable, we've also added a new
ISSUED=date field (e.g., ISSUED=1-jan-1996). If the
ISSUED date is set, then SUPERSEDE uses it, otherwise
it uses the start-date
For example:
INCREMENT f1 ... 1 ...
INCREMENT f1 ... 1 ...
INCREMENT f1 ... 1 ...
INCREMENT f1 ... 4 ... SUPERSEDE
Assuming that the start date on the first 3 INCREMENT
lines are prior to the last, the user will get only 4
uses of f1, and the first 3 INCREMENT lines can be
deleted with no impact on the number of licenses of f1
available. Naturally, this is more readable in
combination with ISSUED:
INCREMENT f1 ... 1 ... ISSUED=1-jan-1995
INCREMENT f1 ... 1 ... ISSUED=1-jan-1995
INCREMENT f1 ... 1 ... ISSUED=1-jan-1995
INCREMENT f1 ... 4 ... SUPERSEDE ISSUED=1-jan-1996
CAPACITY and LM_A_CAPACITY
__________________________
The most common purpose of CAPACITY is to charge more
for a more powerful system. For example, with CAPACITY,
you could automatically checkout more licenses on a Unix
system than on a PC, thereby effectively charging more
for the more powerful system.
CAPACITY is a checkout multiplier--if lc_checkout
requests 1 license, and CAPACITY is set to 3, 3 licenses
will be checked out.
- 28 -
CAPACITY is set by
1) Adding the CAPACITY keyword to the FEATURE
line
2) Setting CAPACITY in the application with
lc_set_attr(job, LM_A_CAPACITY,
(LM_A_VAL_TYPE)value);
This value becomes a multiplier to the
checkout number IF CAPACITY is set in the
license file.
If CAPACITY is missing from the FEATURE line, the attribute
setting in the code will have no effect.
Similarly, if CAPACITY is on the FEATURE line, but
there is no call to lc_set_attr(...LM_A_CAPACITY), this
will have no effect.
The attribute must be set before the first connection
to the server (usually lc_checkout), and cannot be
reset once set.
CAPACITY will create new vendor-daemon pools. (See note about
Vendor Daemon Pools later in this RELEASE_NOTES.)
SUITE_DUP_GROUP for PACKAGE SUITEs
__________________________________
An enabling FEATURE line for a PACKAGE can now specify
a different duplicate grouping for the "parent" of the
suite than for its components via SUITE_DUP_GROUP=xxx
where xxx is any combination of UHDV. (See the manual
for DUP_GROUP for an explanation of duplicate
grouping.) Note: If SUITE_DUP_GROUP is not specified,
the parent will have the same duplicate grouping as
the components.
For example:
PACKAGE pkg demo 1.050 E0A0A0B133C159D609A5 COMPONENTS="c1 c2" OPTIONS=SUITE
FEATURE pkg demo 1.050 01-jan-0 3 6B9C2001518FA9DA4193 DUP_GROUP=U SUITE_DUP_GROUP=NONE
Features "c1" and "c2" will have a duplicate grouping
mask of USER, while the parent feature, "pkg", will
have a mask of NONE. This means the same user can use
3 uses of c1, or
2 uses of c1 and 1 of c2, or
1 use of c1 and 2 of c2
- 29 -
IP Address now supported as hostname on SERVER line
___________________________________________________
You can now use an IP address in the format #.#.#.#
instead of a hostname on the SERVER line. Note this
is ONLY supported when all clients and servers referring
to the license file are v5 or higher.
makekey vs lmcrypt
___________________________
makekey has not been extended to support the new
FEATURE line attributes, and will not be extended in
the future. We recommend that you use lmcrypt
instead, as lmcrypt is much easier to use. Moreover,
adding yet more options to makekey would make it more
and more cumbersome to use. The source for makekey is
available in machind/makekey.c, and you are free to
add options to it as needed.
New FLEXible API Functions
__________________________
lc_expire_days()
________________
This new function returns the number of days until a license
expires. It's syntax is:
int days;
CONFIG *conf;
conf = lc_get_config(job, feature);
days = lc_expire_days(job, conf);
It's return values are:
> 0 -- days till expiration
0 -- license will expire today at midnight
< 0 -- lm_errno: LM_LONGGONE (expired) or
LM_BADPARAM (invalid config argument).
lc_errtext()
____________
Returns error message for FLEXlm errno. Syntax:
(char *)error_message = lc_errtext(lm_job, lm_errno);
Do not free the string returned from this function -- it's
- 30 -
static memory in the FLEXlm library. If needed later, it
should be copied to ensure it's value doesn't change.
lc_chk_conf()
_____________
char * lc_chk_conf(job, conf, check_name)
LM_HANDLE *job;
CONFIG *conf;
int check_name;
Given a pointer to a CONFIG struct, lc_chk_conf
returns a string describing errors in the struct, or
NULL if no problems are found. This is automatically
called by lc_cryptstr(), so if you're using lmcrypt or
lc_cryptstr() you don't need to additionally call
lc_chk_conf().
Normally this should only be used by a license
generation program that calls lc_crypt(), such as
makekey.
If check_name is true, invalid feature names will also be
reported.
lc_heartbeat()
______________
lc_heartbeat can be used instead of lc_timer, allowing
more security and a non-callback based API. Syntax is:
int lc_heartbeat(LM_HANDLE *job, int *ret_num_reconnects,
int minutes)
This is the same as lp_heartbeat, described above.
lc_heartbeat returns 0 upon success or the number of
failed connections to the server. If lc_heartbeat
fails, the application can notify the user, or
if the number of failures is high, penalize the user
by exiting or other steps.
In addition, the 2nd and 3rd arguments can be used to
provide additional security: It is possible to steal
licenses by starting and restarting the server. One
way to thwart this is to detect many reconnections in
a short period, and take appropriate steps if this is
discovered. The ret_num_reconnects is a pointer to
an integer, which is set to the the number of reconnections
in the number of minutes specified in the last argument.
ret_num_reconnects is ONLY set when a reconnection
- 31 -
occurs, which in turn only occurs when lc_heartbeat
returns 0.
Following is a possible example for using this function:
int num_reconnects, rc;
rc = lc_heartbeat(lm_job, &num_reconnects, 10);
if (rc) tell_user("The server is down);
else if (num_reconnects > 3)
{
tell_user("Server restarted too many times");
exit(-1);
}
Vendor Daemon logs licenses soon to expire
__________________________________________
Upon startup, the vendor daemon will report licenses
that will expire within 2 weeks.
End-User Options File "pool" selection
______________________________________
Because of INCREMENT, when you RESERVE based on a
feature name, prior to v5 you could not control which
"pool" for that feature was being RESERVEd. For
example,
FEATURE f1 demo 1.0 ...
INCREMENT f1 demo 2.0 ...
This will create 2 separate pools in the vendor
daemon, tracking version 1.0 licenses SEPARATELY from
v2.0 uses. (Different pools are created if the
version, hostid, and sometimes the vendor-defined
string are different.)
RESERVE 1 f1 USER daniel
This will reserve only from the first pool. Should
you want to reserve a 2.0 version of f1 for daniel,
you can do this with
RESERVE 1 f1:VERSION=2.0 USER daniel
You can specify a feature by any of the following fields:
VERSION
HOSTID
- 32 -
EXPDATE
KEY
VENDOR_STRING
ISSUER
NOTICE
dist_info
user_info
asset_info
Note that the lowercase fields are values that user
can modify in the license file. So, another way to
select the 2nd pool in the above example is to modify
the INCREMENT line to:
INCREMENT f1 demo 2.0 ... asset_info="pick this"
And RESERVE by:
RESERVE 1 f1:asset_info="pick this" USER daniel
This new functionality applies everywhere a feature
name is specified in the end-user options file:
INCLUDE, INCLUDEALL, EXCLUDE, etc.
$LM_PROJECT
___________
If a client application has the $LM_PROJECT
environment variable set, then this will be logged in
the vendor daemon's REPORTLOG, for FLEXadmin's report
writer.
End-User MAX_OVERDRAFT limit
________________________
If a license includes an OVERDRAFT limit, the end-user
can choose to reduce the overdraft amount, in the
end-user options file. The syntax is
MAX_OVERDRAFT feature nnn
where nnn is a number less than the OVERDRAFT amount
for this feature in the license.dat file.
The ascii debug log file reports this:
14:58:03 (demo) FEATURE f1 OVERDRAFT reduced from 20 to 10
This can be used to offer discounts to trusted customers.
- 33 -
lmcrypt and lc_cryptstr()
___________________________
Error messages are improved. Here's an example of the
improved output:
license.dat:line 3:"INCREMENT f1 demo 1.050 01-jan-99 0
DB1C20014C0C97B05C0A USER_BAS ..."
Uncounted (number of users is 0) missing hostid
Invalid license file syntax (-2,269)
New, Simplified Vendor-Defined Hostid--LM_A_VENDOR_ID_DECLARE
_____________________________________________________________
This has been simplified from 4 callback functions,
to 1 callback function and an attribute setting.
Here's sample code:
Step 1: make a source file hostids.c
/* hostids.c: */
/* define a callback function for getting the hostid */
HOSTID *
get_vd_hostid(hostid_num)
int hostid_num;
{
HOSTID *id = l_new_hostid(); /* Must call l_new_hostid()
to allocate this hostid */
/*
* We return the fixed strings for
* illustration. The real function would
* determine the hostid, and return it as
* a string
*/
id->type = hostid_num;
switch (hostid_num == HOSTID_VENDOR)
{
case HOSTID_VENDOR:
strcpy(id->id.vendor, "1234");
return id;
case HOSTID_VENDOR+1:
strcpy(id->id.vendor, "4321")
return id;
default: return (HOSTID *)0; /* internal error */
}
}
- 34 -
/* define a function to register all vendor-defined hostid
information: */
void
register_hostids()
{
/* declare an LM_VENDOR_HOSTID struct */
LM_VENDOR_HOSTID h;
/* register the callback */
lc_set_attr(lm_job, LM_A_VENDOR_GETHOSTID,
(LM_A_VAL_TYPE)(get_vd_hostid));
/* define the first hostid type */
h.label = "MYHOSTID_KEYWORD";
h.hostid_num = HOSTID_VENDOR;
h.case_sensitive = 0;
h.get_vendor_id = get_vd_hostid;
/* register this definition: */
lc_set_attr(lm_job, LM_A_VENDOR_ID_DECLARE,
(LM_A_VAL_TYPE)&h);
/* define the next hostid type */
h.label = "SECOND_HOSTID";
h.hostid_num = HOSTID_VENDOR+1;
h.case_sensitive = 0;
h.get_vendor_id = get_vd_hostid;
/* register this definition: */
lc_set_attr(lm_job, LM_A_VENDOR_ID_DECLARE,
(LM_A_VAL_TYPE)&h);
}
Step 2: call register_hostids from client application, and
license generators (lmcrypt, makekey, etc.)
LM_HANDLE *lm_job;
...
lc_init(..., &lm_job);
register_hostids();
...
Step 3: Modify machind/ls_vendor.c thus:
...
- 35 -
ls_user_init2 = register_hostids;
...
Step 4: Modify makefiles to include hostids.c.
FLEXible API Changes
____________________
ENCRYPTION_CODE_1 and ENCRYPTION_CODE_2 names changed
_____________________________________________________
They are replaced with ENCRYPTION_SEED1 and ENCRYPTION_SEED2.
There is no functional change, just a name change to
use a more standard terminology for the function of these
seeds. If you want to use an existing lm_code.h file,
you'll need to change these names.
lc_get_dlist() and lc_free_daemon_list() removed
________________________________________________
These 2 functions are removed from the public API for
FLEXlm. (They still exist internally as l_get_dlist()
and l_free_daemon_list()). There's little or no reason
why an application should need these functions. In
addition, they don't always work with the new Port At
Host Plus functionality.
lc_flush_config renamed to l_flush_config
_________________________________________
lc_flush_config should no longer be used in applications.
Where an application needs to reread the license file, it
should create a new job, via lc_init(). Otherwise FLEXlm
will itself automatically read the license file when it
is appropriate to do so.
Therefore lc_flush_config() has been renamed to l_flush_config().
l_flush_config() takes the same arguments. You can continue to
use l_flush_config() for now, but at best it rereads the license
file unnecessarily, and at worst it can cause a core dump, if
a successful checkout has already occurred.
lc_node_lock() removed in this version
______________________________________
This function has been removed as of v5.0.
- 36 -
HOSTID struct changed
_____________________
NOHOSTID is removed. This is replaced by a
NULL hostid pointer.
Demo licenses are now indicated by the type member
being set to HOSTID_DEMO. This used to be
override member set to DEMO_SOFTWARE.
CONFIG struct "HOSTID id" member changed
________________________________________
This struct is defined in lm_client.h, and utilized
by many FLEXlm functions. The id member used to be
a HOSTID struct. It's now renamed to idptr, and it's
a pointer to a HOSTID struct. We renamed it so that
if you referenced it in the past, the compiler will
give you a compile time error. The pointer will be
NULL if the CONFIG line doesn't have a hostid. In previous
versions, the type was set to NOHOSTID if there was
nohostid. This type has been removed.
lc_timer returns int -- simpler heartbeat interface
___________________________________________________
lc_timer returns the current number of failed reconnection
attempts to the server.
With this return value, a program can now avoid using
callbacks (LM_A_USER_RECONNECT, and LM_A_USER_RECONNECT_DONE)
to handle heartbeats. Many programmers will find this
a simpler, improved interface when their program must call
lc_timer directly, rather than through SIGALRM (the
default behavior) or via the X or Windows window manager.
NOTE: when lc_timer indicates no connection, do not
then call lc_checkout. lc_timer has already done
this, and calling lc_checkout on an already checked
out feature will result in a confused state.
lc_getid_type() and lc_gethostid()
__________________________________
These function returns a pointer to a list of HOSTID
structs. Each time either one is called, the list is
free'd. Therefore, don't call either twice, and
expect a previously returned pointer to be valid.
LM_A_LICENSE_FILE
- 37 -
LM_A_LICENSE_FILE_PTR
LM_A_LICENSE_DEFAULT (attributes for lc_set_attr)
_______________________________________________________________
LM_A_LICENSE_FILE and LM_A_LICENSE_FILE_PTR are pre-v5
ways of setting these license file location. They
behave the same as in v4, and, (it is noted here
although it wasn't in the v4 manual or RELEASE_NOTES),
behave identically to each other.
LM_A_LICENSE_DEFAULT is new, and is usually preferred
to the old methods.
LM_A_LICENSE_DEFAULT: Normally, this is the preferred,
and most efficient, method for setting the license
file variable. This honors $LM_LICENSE_FILE
environment variable first, then the path indicated to
lc_set_attr(). If no valid license files are found in
either location, it will return LM_NOCONFFILE as an
error.
The only reason to use the older attributes is if you
explicitly do NOT want to honor the $LM_LICENSE_FILE
environment variable, or if you want an error status
returned if the license file is missing, but
$LM_LICENSE_FILE is good. Again, this is not normally
recommended.
As of v5.0, we recommend code similar to the following
to set a default license location:
lc_set_attr(job, LM_A_LICENSE_DEFAULT, path);
where "path" is a location in your product's
distribution hierarchy. Again, this will honor
$LM_LICENSE_FILE first, as well as the license finder,
so that your users can easily override the location in
your distribution hierarchy.
Retry Forever--LM_A_RETRY_COUNT
_______________________________
A more and more common policy is to retry to connect
and checkout a license forever. You can now set
LM_A_RETRY_COUNT to -1 to explicitly request this
behavior.
lc_set_attr(job, LM_A_RETRY_COUNT, (LM_A_VAL_TYPE)-1);
The PC version now defaults to -1 for LM_A_RETRY_COUNT.
- 38 -
In addition, on the PC, it is now disallowed to set
LM_A_RETRY_COUNT to anything other than -1 without
also setting LM_A_USER_EXITCALL.
lc_checkout returns BADPARAM for nlic = 0
__________________________________________
lc_checkout() returns BADPARAM if the number of
licenses to be checked out is 0.
File name changes
_________________
All files now have common names for Windows, VMS, and
Unix, in 8.3 format. On Unix and VMS, and old
filenames will still be available. The following
files are affected:
Old Name New
________ ___
binary directory:
create_license makekey
create_pkg makepkg
isvaliddate validdat
lmcrypter lmcrypt
lmfeatset lmfeats
ls_vendor.o lsvendor.o
machind:
DEMO.notes demo.txt
RELEASE_NOTES relnotes.txt
create_lic.c makekey.c
create_pkg.c makepkg.c
isvaliddate.c validdat.c
lm_client.h lmclient.h
lm_errors.h lmerrors.h
lm_hosttype.h lmhtype.h
lmcrypter.c lmcrypt.c
ls_feature.h lsfeatur.h
ls_master.h lsmaster.h
ls_server.h lsserver.h
ls_vendor.c lsvendor.c
style_guide.ps style.ps
examples directory:
vendor_hostid vdhostid
vendor_info vdinfo
- 39 -
LM_DEMOKIT error removed
________________________
lc_init() never returns LM_DEMOKIT error as of v5.
Other Enhancements
__________________
lc_timer()
__________
This function will do nothing if it is called within
20 seconds of the last time it was called. This
prevents needless delays that would occur should
lc_timer be called too often.
lc_vsend()
__________
This function will now connect to a server if it is
not already connected. Note that if a user has
a colon-separated list for licenses, it will connect
to the first server in the list.
TIMEOUT
_______
If a client is timed-out via the end-user option
TIMEOUT, it is now free'd from the server, within 2
minutes from the time it times out. Previously,
TIMEOUTs were only checked when a license for the same
feature name was requested.
lmdiag
______
lmdiag provides a more extensive description of each
license file line, and provides more error detection,
particularly if the license has been mis-typed.
Vendor Daemon Pools
___________________
When an INCREMENT line occurs for a feature that
already appears in the license file, the vendor
daemon will add these licenses in one of two ways:
either the licenses will be "pooled" with the previous
line, or it will be counted separately, and not "pooled."
- 40 -
This behavior has existed since INCREMENT was introduced
in v3.0, but the specifics were not documented before.
If 2 lines differ by:
hostid
version
USER_BASED
HOST_BASED
CAPACITY
they are counted separately. If they differ in any
other way, they are counted in a single "pool."
REPORTLOG format changed
________________________
The end-user option REPORTLOG format has changed. This is the
file used by FLEXadmin to report on historical usage. The
file is considerably improved:
o The file size is now 1/3 to 1/10 it's old size, depending
on each customer's actual usage (The file size will be
somewhat larger with a larger pool of users.)
o Considerably more information is in the file, including:
- full license file information
- authentication codes to detect end-user
modification.
- more complete transaction information.
lmstrip
_______
lmstrip utility adds additional security to licensing on Unix.
(Note that these security issues don't exist on Windows.)
'lmstrip -h' lists it's usage:
Help: Usage: lmstrip file [ -l ] [ -e | -n ] [ -r ][ strings... ]
-l List internal and external names to be stripped
-e Don't strip external names
-n Don't strip internal and external names
-r Replaces strings with random printable characters
strings Strip these strings from the executable
Use -e if lc_xxx calls are made from shared library
Use -r if you're linking 2 versions of FLEXlm. (This is
discussed fully in the FLEXlm Reference Manual. See lmstrip).
It improves security and ease-of-use in 3 areas:
- 41 -
1) Fully-linked binaries, including vendor daemons
2) Shipping libraries.
3) Linking with libraries that also use FLEXlm.
1) For shipping binaries and vendor daemons, we suggest running:
% lmstrip binary_name
2) Shipping libraries:
Assuming there's a single .o file that makes flexlm calls,
(license.o):
% ld -r license.o liblmgr.a -o lmgr_license.o
% lmstrip -r lmgr_license.o
You then ship lmgr_license.o to your customers.
3) Linking with libraries that already use FLEXlm. See the
FLEXlm Reference Manual.
Other Changes
_____________
Debug libraries are shipped compressed
______________________________________
On Unix, the debug_libs directory contains libraries with
-g debug flag turned on. These libraries are now shipped
compressed. Use the uncompress flag to use these libraries.
License Finder now turned off by default
________________________________________
The FLEXlm finder is turned off on Windows by default.
It can be forced on by setting FLEXLM_USE_FINDER environment
variable to "1". The change was made because the finder
uses gethostbyname(), and this can adversely affect performance,
or cause a hang, when NIS or DNS is not working properly.
Bug fixes:
__________
Bug Platform Description
P265 all lmstat doesn't report two features of the same
name from different daemons.
P338 VMS lmstat and lmswitch failed when daemon started as
batch.
P353 all lc_feat_list failed when first server in colon-sep
- 42 -
list was down
P456 all Can't RESERVE specific INCREMENT lines.
P539 all lc_lic_where sometimes report wrong path.
P564 VMS If license path contained non-existent file, rest
of path wasn't searched.
P639 hp700 Compiler flags weren't always correct.
P668 SCO lc_baddate failed on sco.
P681 SCO Install instructions were incorrect for SCO, where
the install has to be done more manually, since
SCO csh syntax is limited.
P682 all Server pools licenses with different expiring dates,
and doesn't expire licenses after being read.
P688 all lmreread sometimes caused checkouts to fail.
P699 all lmdiag sometimes misleading reported error -73.
P700 NT Timers silently fail in console Mode.
P702 all Name=Value attribute pairs could have false matches.
P707 all reconnection would fail when 2 INCREMENT lines
that don't pool are both checked out.
P715 hp700 lmcrypter failed with gcc as compiler.
P722 all lmdiag missing man page.
P724 all -v arg to lmgrd and utilities wasn't always working.
P743 Windows Counted node-locked to VSN, hangs
P754 all lmstat -A didn't always print correct user list.
P756 all LM_A_PERIODIC_CALL callbacks sometimes didn't get
called.
P757 all lc_checkout with cnt=0 silently fails.
P760 all Vendor-defined hostids must be of type string.
Otherwise silently fail.
P765 rs6000 License file path with '@' in names fails.
P766 all Child processes inherit FLEXlm socket descriptor.
P767 all String hostid types failed with trailing blanks.
P768 all create_license silently creates invalid license
if counted license with no SERVER line.
P772 all 2 quick lmdown commands can corrupt REPORTLOG file.
P774 all PACKAGE with same name as component silently fails.
P783 netware Won't run on Netware v3.11
P786 Win/NT/Netware vendor daemon name > 8 characters fails.
P790 all lmswitch doesn't honor LM_LICENSE_FILE.
P793 hp700 When NIS or DNS fails, log file report ??? for
username.
P796 all lmcksum fails on vendor-defined hostid.
P829 sunos4 Spurious errors reported when SIGALRM set, but
not alarm or setitimer().
P837 NT Can't pass args to lmgrd as a service.
P844 Windows Malloc errors weren't always reported -- a different,
misleading, error would result.
P847 all Can't use lmcrypter with expire date > 2026.
P851 hp700 node-locked features take too long to get hostid,
and use SIGALRM, causing problems with programs
that separately use SIGALRM.
P876 Unix Calling setrlimit after lc_init can cause core dump.
- 43 -
P883 all License lines were sometimes > 80 characters long.
P884 all Can miscount total number of licenses.
P885 Unix lmcrypter leaves temporary file in /usr/tmp when
input is stdin.
P904 all SUITE PACKAGE in ls_use_all_features daemon fails
when enabled with FEATURE.
P905 all lmdown incorrectly report "1 server shutdown" on
redundant servers.
P910 all lc_master_list memory wasn't free'd by lc_free_job().
P914 sgir8 lmver fails, use "string <file> | grep Copy" instead.
P916 all lmstat doesn't report counted features when
preceded by uncounted for daemon none.
P924 all finder used even when $LM_LICENSE_FILE set.
P926 all man page for lc_errstring fixed.
P953 Intel/DEC lmdiag extended diagnostics failed on systems with
reverse-byte order shorts.
P969 all lmcrypt fails if first char in COMPONENTS= is space.
P976 all lc_checkin reported a spurious error when dequeueing.
P989 Win95 License finder doesn't work on Windows 95.
P1009 all lmswitchr failed without a "-c license_file" argument
P1035 all lc_expire_days incorrect when exp-date > 2038
P1045 all report.log linger value is set to dup_select value.
P1052 all DAEMON port number wasn't reused when vd restarted
P1064 all 4-digit year errors in SUPERSEDE, lc_expire_days
P1066 all success of starting REPORTLOG now accurate in
lmgrd log
P1067 all REPORTLOG large license files causes server to fail.
P1072 all large license files fail producing report.log files
P1082 all client can hang in checking out a license with a
& P1089 lot of traffic
P1127 all ip address is incorrect (sometimes) in report.log
P1135 all license for client with DUP_GROUP not always freed
when client dies
P1144 all VD_FEAT_INFO -- user_cnt was wrong
P1052 all DAEMON port not reused with redundant servers.
P1162 all Trivial and Simple API can core dump. Mostly on
solaris 2.4
P1174 all CONFIG_DAEMON edits ls_vendor.c, wrong file --
should be lsvendor.c
P1179 all lmgrd restarting daemon--daemon can hang because the
port is in use.
P1180 Win/NT Backwards compatibility problem with 4.1 rainbows
dongle license
P1188 all INTERNET= hostid fails when counted.
P1190 all lc_userlist(), called 2+ times, gives duplicate
results with port@host (or USE_SERVER)
P1225 NT v4 style of vendor-defined hostid failed with v5.
P1230 all lc_userlist can fail.
P1268 all LM_A_VD_FEATURE_INFO can fail with redundant servers
P1277 all node-locked client can hang with port@host when
on wrong host.
- 44 -
Known bugs:
___________
P1007 sco UDP communications does not work. It appears to
be a bug in the OS we ported to, 3.2v5.
P1179 all PORT=nnn only: lmgrd restarting daemon,
daemon can hang until clients drop connections to
dead daemon.
Platform Specific Notes:
________________________
i86_w3
______
Win32s will not be supported after FLEXlm v5. This is
because Microsoft is discontinuing support for win32s.
UNIX
____
alpha_u1
________
uname -a: OSF1 speedy 1.2 10 alpha
CC: cc -std1
decs_u4
_______
uname -a: ULTRIX newport 4.2 0 RISC
CC: /bin/cc -DPMAX -DULTRIX -DMIPS
dg_u5
_____
uname -a: dgux dgsvr4 5.4 generic AViiON mc88100
CC: /bin/cc
encore_u4
_________
uname -a: UNIX_SV encore 4.2MP 4.0.0.10 m88k m88k
CC: /usr/bin/cc
hp300_u8
________
uname -a: HP-UX agent86 B.08.00 A 9000/375 080009060992
- 45 -
CC: /bin/cc
link flags: -lBSD
hp700_u8
________
uname -a: HI-UX hit1 02.03_/B E 3050/R 154
CC: /bin/cc -Aa -D_HIUX_SOURCE +DA1.0 +DS1.0
(replace HIUX with HPUX on an HP system)
i86_d4
______
uname -a: dgux dgbig R4.11 generic AViiON Pentium
CC: /bin/cc, actually, /usr/opt/sdk/sde/ix86dgux/usr/bin
NOTE: hostid comes from /dev/net/*. By default these files
are only readable by root. We recommend changing the
perms to:
# chmod 644 /dev/net/*
i86_l1
______
uname -a: Linux linux 1.2.13 #1 Sun Aug 13 06:33:35 EDT 1995 i586
CC: /usr/bin/cc
cc -v: Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.0/specs
gcc version 2.7.0
IMPORTANT NOTE: v5 version uses ethernet address as a hostid,
which is relatively secure. v4 used the 'hostid' command,
which was not secure. To obtain the ethernet address, type:
/sbin/ifconfig eth0
Convert the hardward address as follows:
From: HWaddr 00:40:05:16:E5:25
To: 00400516E525
V5 lmhostid will report ethernet address by default. v4
will report 'hostid'. Both types of hostid are acceptable
to version 5 clients and servers.
lmhostid, or lmhostid -ether
-- obtains the ethernet address (secure)
lmhostid -long
-- obtains the output from the 'hostid' command
(not secure)
i86_u2
- 46 -
______
uname -a: UNIX_SV rolm 4.2MP 2.0 i386 x86at
CC: /usr/bin/cc
i86_x5 (Solaris on Intel)
______
uname -a: SunOS sunpc 5.4 generic i86pc i386
CC: /opt/SUNWspro/bin (version 3.0)
moto_u4
_______
uname -a: UNIX_System_V motosvr4 4.0 R40V4.2 m88k mc88100
CC: /bin/cc
link flags: -lsocket -lnsl
nec_u2
______
uname -a: UNIX_System_V nec 4.0 2 R3000 r3000
CC: /bin/cc
link flags: -lsocket -lnsl
rs6000_u3
_________
uname -a: AIX rs6000 1 3 000276513100
CC: /bin/cc -D_BSD -D_BSD_INCLUDES
link flags: -lbsd
sco_u3
______
uname -a: SCO_SV sco 3.2 2 i386
uname -X:
System = SCO_SV
Node = sco
Release = 3.2v5.0.0
KernelID = 95/04/19
Machine = i80486
BusType = ISA
Serial = 2CG001148
Users = 5-user
OEM# = 0
Origin# = 1
NumCPU = 1
CC: /bin/cc -Dsco
link flags: scoinfo.o -lsocket
- 47 -
IMPORTANT NOTE: Previous FLEXlm versions were built on an older OS:
Release = 3.2v2.0
KernelID = 90/10/01
sgi_u4
______
uname -a: IRIX oly 4.0 08212247 IP6
CC: /usr/bin/cc -cckr
link flags: -lsun -lbsd -lc_s
sgi_u5
______
uname -a: IRIX indy 5.2 02282013 IP12 mips
CC: /bin/cc
To build -n32 -mips3 or -n32 -mips4 on IRIX 6:
1) In this directory, do:
% make o32
This builds all binaries in o32 format.
2) Link your application (which has been compiled with
-n32 -mips3 (or -mips4) with the correct FLEXlm library:
liblmgr_n32mips3.a, or
liblmgr_n32mips4.a
NOTE: sgi keys are required for any 32-bit binary, including
IRIX 6 with -n32 flags.
sgi64_u6
________
uname -a: IRIX64 challenger 6.1 07121831 IP26 mips
CC: /bin/cc
This was called sgir8_u6 in previous versions. It's been
renamed to reflect the fact that it's 64-bit.
To build -n32 -mips3 or -n32 -mips4, see sgi_u5 above.
We currently only support 64-bit, mips4 binaries, which
is how all files in this directory are compiled.
sun4_u4
_______
- 48 -
uname -a: SunOS ss 4.1.2 2 sun4c
CC: /bin/cc
sun4_u4 is now built on a 4.1.2 system. This means that it
will no longer work with 4.0.3 systems.
sun4_u5
_______
uname -a: SunOS backstage 5.1 Generic sun4m sparc
CC: /opt/SUNWspro/bin/cc